package com.sz7thrd.ts.ccu;

import com.sz7thrd.ts.ccu.filter.codec.MyCodecFactory;
import com.sz7thrd.ts.ccu.filter.firewall.BlacklistFilter;
import com.sz7thrd.ts.ccu.filter.firewall.Subnet;
import com.sz7thrd.ts.ccu.handler.MyHandler;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.util.concurrent.Executors;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSessionConfig;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class Main {

    private static final int PORT = 12345;//定义监听端口 

    public static void main(String[] args) throws UnknownHostException {
        // 服务器端的主要对象
        NioSocketAcceptor acceptor = new NioSocketAcceptor(5);
        //建立线程池   
//        java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(1500);
//        //加入过滤器（Filter）到Acceptor
//        //加入一个线程池到适配器，这里用的是jdk自带的线程池
//        acceptor.getFilterChain().addLast("exector", new ExecutorFilter(threadPool));
        // 设置Filter链 
        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
        // 协议解析，采用mina现成的UTF-8字符串处理方式
        acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MyCodecFactory(Charset.forName("UTF-8"))));
        
//        BlacklistFilter blacklistFilter=new BlacklistFilter();  
//        InetAddress[] address= new InetAddress[1];  
//        address[0]=InetAddress.getByName("*");  
//        blacklistFilter.setBlacklist(address);
//        Subnet sb = new Subnet(null, PORT)
//        blacklistFilter.setSubnetBlacklist(subnets);
//        blacklistFilter.unblock(address[0]);
//        acceptor.getFilterChain().addFirst("black",blacklistFilter);
        
        //acceptor.getFilterChain().addLast("codec",new ProtocolCodecFilter(new MyDecoder()，new MyEncoder()));
        //设置的是主服务监听的端口可以重用  
        acceptor.setReuseAddress(true);
        
        // 获得IoSessionConfig对象
	SocketSessionConfig cfg = acceptor.getSessionConfig();
        //设置每一个非主监听连接的端口可以重用   
        cfg.setReuseAddress(true);
        //设置输入缓冲区的大小   
        cfg.setReceiveBufferSize(1024);
        //设置输出缓冲区的大小 
        cfg.setSendBufferSize(10240);
        //设置为非延迟发送，为true则不组装成大包发送，收到东西马上发出   
        cfg.setTcpNoDelay(true);
        
        // 这个方法设置读取缓冲的字节数，但一般不需要调用这个方法，因为IoProcessor 会自动调整缓冲的大小
        // cfg.setReadBufferSize(2048);
        
        // 读写通道10秒内无操作进入空闲状态
        // 这个方法设置关联在通道上的读、写或者是读写事件在指定时间内未发生，
        // 该通道就进入空闲状态。一旦调用这个方法，则每隔idleTime 都会回调过滤器、IoHandler 中的sessionIdle()方法。
        cfg.setIdleTime(IdleStatus.BOTH_IDLE, 10);
        
        // 这个方法设置写操作的超时时间。写操作超时时间10秒
        // acceptor.getSessionConfig().setWriteTimeout(10);
        
        //设置主服务监听端口的监听队列的最大值为100，如果当前已经有100个连接，再新的连接来将被服务器拒绝   
        acceptor.setBacklog(100);
        acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));

        // 设置消息处理类（创建、关闭Session，可读可写等等，继承自接口IoHandler）
        // 指定业务逻辑处理器 
        acceptor.setHandler(new MyHandler());

        try {
            // 服务器开始监听
            acceptor.bind();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
